from array import array
from random import random

floats = array('d', (random() for i in range(10**7)))#从一个可迭代对象（本例使用的是一个生成器表达式）中创建一个双精度浮点数数组（类型代码为'd'）。
#floats[-1]  0.07802343889111107
fp = open('floats.bin', 'wb')
floats.tofile(fp) #把数组存入一个二进制文件。
fp.close()
floats2 = array('d') #创建一个存放双精度浮点数的空数组
fp = open('floats.bin', 'rb')
floats2.fromfile(fp, 10**7)  #从二进制文件中读取1000万个数。
fp.close()
#floats2[-1] 0.07802343889111107
# #floats2 == floats True


'''
memoryview:内置的memoryview类是一种共享内存的序列类型，可在不复制字节的情况下处理数组的切片。memoryview.cast方法使用的表示法与array模块类似，作用是改变读写多字节单元的方式，无须移动位。memoryview.cast方法返回另一个memoryview对象，而且始终共享内存。
'''
octets = array('B', range(6))
m1 = memoryview(octets)
m1.tolist()#[0, 1, 2, 3, 4, 5]
m2 = m1.cast('B', [2, 3])#根据前一个memoryview对象构建一个新memoryview对象，不过是2行3列。
m2.tolist()#[[0, 1, 2], [3, 4, 5]]
m2[1,1]=22#此时m1、octets对应位置的值都会发生改变，它们的内存是共享的


numbers = array.array('h', [-2, -1, 0, 1, 2])#'h' 表示短整型（2 字节有符号整数），取值范围为 -32768 到 32767。
memv = memoryview(numbers)
memv_oct = memv.cast('B')#将内存视图重新解释为 ​无符号字节（1 字节/元素）​。
'''
由于原始数据是 'h'（2 字节/元素），转换后会按字节拆解：
每个短整型（2 字节）会被拆成 2 个独立的字节。
字节顺序取决于系统的 ​字节序​（这里假设为小端序，即低位在前）。

字节拆解（小端序）​
短整型 -2 的二进制表示（2 字节补码）：
原值：-2 → 补码：0xFFFE（二进制 11111111 11111110）
小端序存储：低字节在前 → [0xFE, 0xFF] → [254, 255]
短整型 -1：
补码：0xFFFF → [0xFF, 0xFF] → [255, 255]
短整型 0：
补码：0x0000 → [0x00, 0x00] → [0, 0]
短整型 1：
补码：0x0001 → [0x01, 0x00] → [1, 0]
短整型 2：
补码：0x0002 → [0x02, 0x00] → [2, 0]
'''
oct=memv_oct.tolist()#[254, 255, 255, 255, 0, 0, 1, 0, 2, 0]
memv_oct[5] = 4#number变成[-2, -1, 1024, 1, 2]